 
/* 
 * Copyright (C) Ignacio Lucas
 */
 
/*
 *  io_handler, hecho Ignacio Lucas
 *
 *  Encapsulamiento de mecanismo de multiplexacion de eventos de Entrada/Salida de red.
 *
 *  Ignacio Lucas <ignacio.lucas@gmail.com>
 */
#if !defined(IO_HANDLER_H)
#define IO_HANDLER_H

#include "job_event.h"

/* estructura asociada al mecanismo de multiplexacion */
typedef struct s_io_handler *io_handler_t;

/* 
inicializacion default del mecanismo de multiplexacion. Se indica la funcion de callback que procesara cada evento surgido. 
*/
io_handler_t io_handler_init(event_fired_callback callback);

/* 
inicializacion del mecanismo de multiplexacion indicando la maxima
cantidad de eventos simultaneos que se espera surjan de io_handler. 
Se indica la funcion de callback que procesara cada evento surgido. 
*/
io_handler_t io_handler_init_max_events(unsigned int max_events, event_fired_callback callback);

/* destruccion del mecanismo de multiplexacion. */
int io_handler_destroy(io_handler_t ioh_t);

/* 
registro de interes para ser notificados por un evento.
recibe por parametro:

event: la configuracion del evento de interes. Esta misma referencia sera devuelta a la aplicacion cuando surja el evento, por lo que dicha referencia no debe perderse luego de llamado a este metodo (es decir, no debe ser una variable que sea destruida posteriormente a ser recibida en esta funcion). No puede ser NULL.

argumentos de job_event:
1) persistent: 
	si se espara que el mecanismo de notifiacion mantenga la configuracion de eventos luego de disparado un evento. Si se
	indica persistent=0, luego de un evento generado, la configuracion del evento permanecera inactiva, sin borrarse.
2) edge_or_level:
	1 si se quiere que las notificaciones respeten el mecanismo de disparo de eventos por nivel. 
	0 si se quiere mecanismo de disparo	por flanco (edge-triggered).
*/
int io_handler_register_event_interest(io_handler_t ioh_t, job_event_t event);

/* funcion donde el invocador queda bloqueado a la espera de nuevos eventos. */
int io_handler_process_events(io_handler_t ioh_t);

#endif
